package com.chj.chuji.tijie14;

//https://blog.nowcoder.net/n/1317c459eb2a4925a7ff78f9e6f39e4f
public class BlueMage04 {

	public static void dfs(int u, int fa) {
		dp[u][1] = sz[u] = 1;
		for (int i = head[u]; i > 0; i = edge[i].nex) {
			int v = edge[i].v;
			if (v == fa)
				continue;
			dfs(v, u);
			int sum = 0;
			for (int j = 1; j <= Math.min(sz[v], k); j++) {
				sum = (sum + dp[v][j]) % mod;
			}
			for (int j = Math.min(k, sz[u]); j > 0; j--) {
				for (int p = Math.min(k, sz[v]); p > 0; p--) {
					if (j + p <= k)
						dp[u][j + p] = (dp[u][j + p] + dp[u][j] * dp[v][p]) % mod;// 不删边

				}
				dp[u][j] = dp[u][j] * sum % mod;// 删除这个边
			}

			sz[u] += sz[v];
		}

	}

	public static class Edge {
		public int v;
		public int nex;

		public Edge(int v, int nex) {
			this.v = v;
			this.nex = nex;
		}

		public Edge() {
		}
	}

	public static final int mod = 998244353;
	public static final int maxn = 2000 + 10;
	public static int cnt = 0;
	public static int[] head = new int[2020];
	public static int[] sz = new int[2020];
	public static int[][] dp = new int[2020][2020];
	public static int n;
	public static int k;
	public static Edge[] edge = new Edge[2020];

	public static void add(int u, int v) {
		edge[++cnt].v = v;
		edge[cnt].nex = head[u];
		head[u] = cnt;
	}

	public static void main(String[] args) {

		n = 5;
		k = 2;
//		1 2
//		1 3
//		2 4
//		2 5

		for (int i = 0; i < 10; i++) {
			Edge eeEdge = new Edge();
			edge[i] = eeEdge;
		}

		add(1, 2);
		add(2, 1);

		add(1, 3);
		add(3, 1);

		add(2, 4);
		add(4, 2);

		add(2, 5);
		add(5, 2);

		dfs(1, 0);
		int ans = 0;
		for (int i = 1; i <= k; i++) {
			ans = (ans + dp[1][i]) % mod;
		}

		System.out.println(ans);
	}
}

//#include <cstdio>
//#include <cstring>
//#include <algorithm>
//#include <set>
//#include<iostream>
//#include<vector>
//#include<queue>
////#include<bits/stdc++.h>
//using namespace std;
//typedef long long ll;
//#define SIS std::ios::sync_with_stdio(false)
//#define space putchar(' ')
//#define enter putchar('\n')
//#define lson root<<1
//#define rson root<<1|1
//typedef pair<int,int> PII;
//const int mod=998244353;
//const int N=2e6+10;
//const int M=2e3+10;
//const int inf=0x7f7f7f7f;
//const int maxx=2e5+7;
// 
//ll gcd(ll a,ll b)
//{
//    return b==0?a:gcd(b,a%b);
//}
// 
//ll lcm(ll a,ll b)
//{
//    return a*(b/gcd(a,b));
//}
// 
//template <class T>
//void read(T &x)
//{
//    char c;
//    bool op = 0;
//    while(c = getchar(), c < '0' || c > '9')
//        if(c == '-')
//            op = 1;
//    x = c - '0';
//    while(c = getchar(), c >= '0' && c <= '9')
//        x = x * 10 + c - '0';
//    if(op)
//        x = -x;
//}
//template <class T>
//void write(T x)
//{
//    if(x < 0)
//        x = -x, putchar('-');
//    if(x >= 10)
//        write(x / 10);
//    putchar('0' + x % 10);
//}
//ll qsm(int a,int b,int p)
//{
//    ll res=1%p;
//    while(b)
//    {
//        if(b&1) res=res*a%p;
//        a=1ll*a*a%p;
//        b>>=1;
//    }
//    return res;
//}
// 
//struct node
//{
//    int v,nex;
//}edge[N];
//int cnt=0,head[2020];
//ll sz[2020];
//ll dp[2020][2020];
//ll n,k;
//void add(int u,int v)
//{
//    edge[++cnt].v=v;
//    edge[cnt].nex=head[u];
//    head[u]=cnt;
//}
// 
//void dfs(int u,int fa)
//{
//    dp[u][1]=sz[u]=1;
//    for(int i=head[u];~i;i=edge[i].nex)
//    {
//        int v=edge[i].v;
//        if(v==fa)continue;
//        dfs(v,u);
//        ll sum=0;
//        for(int j=1;j<=min(sz[v],k);j++)
//        {
//            sum=(sum+dp[v][j])%mod;
//        }
//        for(int j=min(k,sz[u]);j;j--)
//        {
//            for(int p=min(k,sz[v]);p;p--)
//            {
//                if(j+p<=k) dp[u][j+p]=(dp[u][j+p]+dp[u][j]*dp[v][p])%mod;//不删边
// 
//            }
//            dp[u][j]=dp[u][j]*sum%mod;//删除这个边
//        }
// 
//        sz[u]+=sz[v];
//    }
// 
//}
//int main()
//{
//  SIS;
// 
//  cin>>n>>k;
//  memset(head,-1,sizeof head);
//  for(int i=0;i<n-1;i++)
//  {
//      int u,v;
//      cin>>u>>v;
//      add(u,v);
//      add(v,u);
//  }
//  dfs(1,0);
//  ll ans=0;
//  for(int i=1;i<=k;i++)
//    ans=(ans+dp[1][i])%mod;
//    cout<<ans<<endl;
// 
// 
//    return 0;
//}
